package com.xinke.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MyConverter {

    /**
     * 将高速桩号（如K1444+300）转换为Decimal(8,3)对应的BigDecimal
     *
     * @param stakeNumber 桩号字符串（格式：K+整数+"+"+整数，如K1444+300）
     * @return 转换后的BigDecimal（保留3位小数）
     * @throws IllegalArgumentException 桩号格式错误时抛出
     */
    public static BigDecimal convertToDecimal(String stakeNumber) {
        // 正则表达式：匹配 K+数字+"+"+数字+任意后缀（如PDF）
        Pattern pattern = Pattern.compile("([a-zA-Z]+)(\\d+)[+.＋](\\d+).*");
        Matcher matcher = pattern.matcher(stakeNumber);

        // 校验格式是否匹配
        if (!matcher.matches()) {
            throw new IllegalArgumentException("桩号格式错误，需为 Kxxx+xxx... 格式（如 K207+261PDF）");
        }

        // 提取千米数和米数
        int km = Integer.parseInt(matcher.group(2)); // 分组1：千米部分（如207）
        int meters = Integer.parseInt(matcher.group(3)); // 分组2：米部分（如261）

        // 计算总千米数（米转千米：meters / 1000）
        BigDecimal kmDecimal = new BigDecimal(km);
        BigDecimal metersDecimal = new BigDecimal(meters)
                .divide(new BigDecimal(1000), 3, RoundingMode.HALF_UP); // 米转千米，保留3位小数

        BigDecimal total = kmDecimal.add(metersDecimal)
                .setScale(3, RoundingMode.HALF_UP); // 总和固定3位小数

        // 校验是否符合 Decimal(8,3) 的长度限制（总有效数字 ≤8）
        if (total.precision() > 8) {
            throw new IllegalArgumentException("转换结果超出 Decimal(8,3) 的长度限制");
        }

        return total;

    }

//    String gczbh = (new StringBuilder().append(tollgrantryid.substring(0, 5)).append("E").append(pilenumber.substring(pilenumber.length() - 3)).append(cityCode)).toString();

    public static String converterGCZBH(String tollgrantryid, String pilenumber, String area) {
        Pattern pattern = Pattern.compile("([a-zA-Z]+)(\\d+)[+.＋](\\d+).*");
        Matcher matcher = pattern.matcher(pilenumber);
        // 校验格式是否匹配
        if (!matcher.matches()) {
            throw new IllegalArgumentException("桩号格式错误，需为 Kxxx+xxx... 格式（如 K207+261PDF）");
        }
        return tollgrantryid.substring(0, 5) + "E" + matcher.group(3) + HunanCityCodeUtil.getCityCode(area);
    }

    public static String updateGCZBH(String gczbh, BigDecimal zh, String xzqhdm) {
        String subGczbh = gczbh.substring(0, 6);
        String zhString = zh.toString();
        String subZh = zhString.substring(zhString.length() - 3);
        return subGczbh + subZh + xzqhdm;
    }


    // 测试示例
    public static void main(String[] args) {
        try {
            String stake1 = "K1444+300";
            BigDecimal result1 = convertToDecimal(stake1);
            System.out.println(stake1 + " 转换后：" + result1); // 输出 1444.300

            String stake2 = "K0+500";
            BigDecimal result2 = convertToDecimal(stake2);
            System.out.println(stake2 + " 转换后：" + result2); // 输出 0.500

            String stake3 = "K123+999";
            BigDecimal result3 = convertToDecimal(stake3);
            System.out.println(stake3 + " 转换后：" + result3); // 输出 123.999

            // 测试边界情况（米数超过1000，自动进位）
            String stake4 = "K1234+1000";
            BigDecimal result4 = convertToDecimal(stake4);
            System.out.println(stake4 + " 转换后：" + result4); // 输出 1235.000
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        }
    }
}
